package NIO;

import java.nio.ByteBuffer;

import static NIO.ByteBufferUtil.debugAll;

public class Practice {
    /*
网络上有多条数据发送给服务端，数据之间使用 \n 进行分隔 但由于某种原因这些数据在接收时，被进行了重新组合，例如原始数据有3条为

Hello,world\n
I'm zhangsan\n
How are you?\n
变成了下面的两个 byteBuffer (黏包，半包)

Hello,world\nI'm zhangsan\nHo
w are you?\n
现在要求你编写程序，将错乱的数据恢复成原始的按 \n 分隔的数据
     */

    public static void main(String[] args) {
        ByteBuffer byteBuffer=ByteBuffer.allocate(32);

        byteBuffer.put("Hello,world\nI'm zhangsan\nHo".getBytes());
        split(byteBuffer);
        System.out.println("positon="+byteBuffer.position());//split函数中，把ho移动到了最前面，所以position应该为2，limit为32
        System.out.println("limit="+byteBuffer.limit());
        byteBuffer.put("w are you?\nhaha!\n".getBytes());
        split(byteBuffer);
    }

    private static void split(ByteBuffer source){
        //切换成读模式
        source.flip();
        int oldLimit=source.limit();

        for (int i=0;i<oldLimit;i++){

            //这里注意，使用get（i）是不会移动position位置的
            if (source.get(i)=='\n'){
                System.out.println(i);
                ByteBuffer target=ByteBuffer.allocate(i-source.position()+1);
                source.limit(i+1);

                //put的同时，会把positon的位置移动
                target.put(source);
                debugAll(target);

                source.limit(oldLimit);
            }
        }

        //将剩下的byte移动到最前面
        source.compact();

    }
}
